; nasm 的宏，语法为：宏名 equ 值

LOADER_BASE_ADDR equ 0x900  ; Loader 被加载的目标地址
LOADER_START_SECTOR equ 0x2 ; Loader 所处的扇区

; ------- gdt 描述符属性 -----------
DESC_G_4K   equ 1000_0000_0000_0000_0000_0000b    ; 第23位置1,粒度为 4KB
DESC_D_32   equ  100_0000_0000_0000_0000_0000b ; 第22位置1，兼容286，置1就行了，表示运行在32位环境
DESC_L      equ (0<<20)   ; 第21位，标记是否为64位代码段

;
DESC_AVL equ (0 << 19); CPU 不用，设置为0，硬件不使用

DESC_LIMIT_CODE2    equ (1111_0000_0000_0000_0000b) ; 段界限 19~16位，代码段界限的第2部分
DESC_LIMIT_DATA2    equ DESC_LIMIT_CODE2    ; 与低位0xffff组成0xffffffff，即访问范围了4GB
DESC_LIMIT_VIDEO2   equ 1011b   ; 保护模式下的基地址为 0xb8000，所以最后8位应该是b，而不是0

DESC_P              equ (1000_0000_0000_0000b)  ; 第15位，是否在内存中，平坦模型只有一段，在内存中，不会有换出一说
DESC_DPL_0          equ (0 << 13)   ; 14~13位，DPL
DESC_DPL_1          equ (1b << 13)
DESC_DPL_2          equ (10b << 13)
DESC_DPL_3          equ (11b << 13)

DESC_S_CODE         equ (1_0000_0000_0000b)      ; S=1表示为数据段，对CPU来说，都是数据
DESC_S_DATA         equ DESC_S_CODE
DESC_S_sys          equ (0 << 12)       ; S=0表示系统段，这里指内置硬件门
; x=1,c=0,r=0,a=0，代码段可执行、非一致性，不可读，已访问位清零
DESC_TYPE_CODE      equ (1000_0000_0000b)   
; x=0,e=0,w=1,a=0, 数据段不可执行，向上扩展，可写，已访问位清零
DESC_TYPE_DATA      equ (10_0000_0000b)
; HIGH4 表示段描述符的高4字节。上述设置中，段基址取值均为0，由于是平坦模型，段基址都取0
DESC_CODE_HIGH4     equ (0x00 << 24) + DESC_G_4K + DESC_D_32 + \
    DESC_L + DESC_AVL + DESC_LIMIT_CODE2 + \
    DESC_P + DESC_DPL_0 + DESC_S_CODE + \
    DESC_TYPE_CODE + 0x00

DESC_DATA_HIGH4     equ (0x00 << 24) + DESC_G_4K + DESC_D_32 + \
    DESC_L + DESC_AVL + DESC_LIMIT_DATA2 + \
    DESC_P + DESC_DPL_0 + DESC_S_DATA + \
    DESC_TYPE_DATA + 0x00

DESC_VIDEO_HIGH4    equ (0x00 << 24) + DESC_G_4K + DESC_D_32 + \
    DESC_L + DESC_AVL + DESC_LIMIT_VIDEO2 + \
    DESC_P + DESC_DPL_0 + DESC_S_DATA + \
    DESC_TYPE_DATA + 0x00

; ---- 选择子属性 ----
RPL0        equ 00b
RPL1        equ 01b
RPL2        equ 10b
RPL3        equ 11b
TI_GDT      equ 000b
TI_LDT      equ 100b